package com.gsbelarus.gedemin.income.fragment;

import android.content.Intent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.TextView;

import com.gsbelarus.gedemin.income.table.ClientsTable;
import com.gsbelarus.gedemin.income.R;
import com.gsbelarus.gedemin.income.activity.Income;
import com.gsbelarus.gedemin.income.adapter.ClientsListAdapter;
import com.gsbelarus.gedemin.income.sync.DataBaseHelper;
import com.gsbelarus.gedemin.lib.ui.ArgumentsHelper;
import com.gsbelarus.gedemin.lib.Utils;
import com.gsbelarus.gedemin.lib.ui.fragment.ListFragmentModel;

import java.util.List;

/**
 * Месяц
 * (Меню - Календарь - Месяц)
 * 1. Календарная сетка месяца по неделям. Для выходных и праздничных дней
 * используется штриховка фона.
 * 2. В клетке показывается число.
 * 3. Цвет фона показывает соотношение факт/план.
 * 4. Тач по клетке переводит на экран Поступления.
 * 5. На Action Bar располагаются команды Пред месяц, След месяц.
 */
public class CalendarMonthFrgm extends ListFragmentModel {

    public String SelectedMonthName = "";

    /**
     * данные, полученные из БД, для вывода в list:
     * ClientsTable.id - номер дня в месяце, например 1..31 в январе
     * ClientsTable.name - номер дня, запятая, день недели, например, "14, Пт"
     * ClientsTable.paidSum - оплаченная сумма на дату
     * ClientsTable.planSum - плановая сумма на дату
     */
    private List<ClientsTable> contacts;

    private ClientsListAdapter adapter;

    /**
     * Если нужно переопределяется в классе наследнике, возвращает id View заголовка
     */
    @Override
    public Integer getHeaderId() {
        return R.layout.header;
    }

    /**
     * Статический компонент на форме под заголовком.
     * Метод автоматически вызывается после чтения данных из БД.
     * Выводится номер выбранного года
     */
    @Override
    public void onCreateViewFragment(View rootView) {
        super.onCreateViewFragment(rootView);

        SelectedMonthName = Utils.getMonthName(context, argumentsHelper.selectedMonth - 1);
        TextView textSum = (TextView) rootView.findViewById(R.id.date_name);
        textSum.setText(SelectedMonthName + " " + String.valueOf(argumentsHelper.selectedYear));
    }

    /**
     * Обработчик нажатия на элемент списка:
     * создается интент для запуска нового потока (activity) Income
     * для открытия формы Поступления.
     * В качестве параметров передаются выбранные год, месяц, день
     */
    @Override
    public void onListItemClick(AdapterView<?> adapterView, View view, int position, long id) {
        if (adapter.getItem(position).getId() == ClientsListAdapter.TOTAL_SUM)
            return;
        if (adapter.getItem(position).getPlanSum() == 0 && adapter.getItem(position).getPaidSum() == 0)
            return;
        Intent intent = new Intent(getActivity(), Income.class);
        intent.putExtra(ArgumentsHelper.SELECTED_DAY, adapter.getItem(position).getId());
        intent.putExtra(ArgumentsHelper.SELECTED_MONTH, argumentsHelper.selectedMonth);
        intent.putExtra(ArgumentsHelper.SELECTED_YEAR, argumentsHelper.selectedYear);
        startActivity(intent);
    }

    /**
     * Чтение данных из БД в новом потоке
     */
    @Override
    public void readDataBase() {
        DataBaseHelper dbh = DataBaseHelper.getInstance(context);
        contacts = dbh.getCalendarMonthList(argumentsHelper.selectedMonth, argumentsHelper.selectedYear);
    }

    /**
     * Метод вызывается после чтения данных из БД или при смене ориентации экрана.
     * Может быть вызван до окончания выполнения потока для запроса данных из БД, поэтому следует проверять данные на null.
     * Служит для инициализации View данными
     *
     * @param rootView корневое View
     */
    @Override
    public void initView(View rootView) {
        if (contacts == null)
            return;
        adapter = new ClientsListAdapter(context, contacts);
        list.setAdapter(adapter);
    }
}
